Spring Security ব্যবহার করে Authentication এবং Authorization বাস্তবায়ন করার একটি সাধারণ উদাহরণ নিম্নে দেয়া হলো।
Authentication এবং Authorization বাস্তবায়নের ধাপসমূহ
1. প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করা
Spring Boot ব্যবহার করলে spring-boot-starter-security ডিপেন্ডেন্সি যোগ করুন।
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. SecurityConfig ক্লাস তৈরি করা
@Configuration এবং @EnableWebSecurity এনোটেশন ব্যবহার করে একটি কনফিগারেশন ক্লাস তৈরি করুন, যেখানে Authentication এবং Authorization এর নিয়মাবলী সংজ্ঞায়িত করা হবে।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // শুধুমাত্র ADMIN রোলের জন্য
.antMatchers("/user/**").hasRole("USER") // শুধুমাত্র USER রোলের জন্য
.antMatchers("/public/**").permitAll() // পাবলিক API সবার জন্য উন্মুক্ত
.anyRequest().authenticated() // অন্য যেকোনো অনুরোধ প্রমাণীকরণ প্রয়োজন
.and()
.formLogin() // ফর্ম ভিত্তিক লগইন সক্রিয়
.and()
.httpBasic(); // HTTP Basic Authentication সক্রিয়
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
3. In-Memory Authentication সেটআপ
In-Memory Authentication ব্যবহার করে একটি সহজ ডেমো বাস্তবায়ন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
public class UserConfig {
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
UserDetails admin = User.builder()
.username("admin")
.password(passwordEncoder.encode("admin123"))
.roles("ADMIN")
.build();
UserDetails user = User.builder()
.username("user")
.password(passwordEncoder.encode("user123"))
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, user);
}
}
4. Controller তৈরি
এখন কিছু এন্ডপয়েন্ট তৈরি করা যাক, যেখানে বিভিন্ন রোল অনুযায়ী Authorization প্রয়োগ করা হবে।
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/")
public class AppController {
@GetMapping("/public")
public String publicEndpoint() {
return "This is a public endpoint. Everyone can access!";
}
@GetMapping("/user")
public String userEndpoint() {
return "This endpoint is for USERS only!";
}
@GetMapping("/admin")
public String adminEndpoint() {
return "This endpoint is for ADMINS only!";
}
}
উদাহরণের কাজের প্রক্রিয়া
- Public Endpoint:
/publicএন্ডপয়েন্টে অ্যাক্সেস করতে Authentication প্রয়োজন নেই। এটি সবাই দেখতে পারে।
- User Endpoint:
/userএন্ডপয়েন্টে শুধুUSERরোলের ইউজাররা অ্যাক্সেস করতে পারবে।
- Admin Endpoint:
/adminএন্ডপয়েন্টে শুধুADMINরোলের ইউজাররা অ্যাক্সেস করতে পারবে।
HTTP Basic Authentication দিয়ে পরীক্ষা করা
Spring Security এর HTTP Basic Authentication ব্যবহার করলে, নিচের মতো লগইন পপ-আপ আসবে যেখানে আপনি ইউজারনেম এবং পাসওয়ার্ড দিয়ে লগইন করতে পারবেন।
টেস্ট:
- URL:
http://localhost:8080/public
Response: "This is a public endpoint. Everyone can access!" - URL:
http://localhost:8080/user- Username:
user - Password:
user123
Response: "This endpoint is for USERS only!"
- Username:
- URL:
http://localhost:8080/admin- Username:
admin - Password:
admin123
Response: "This endpoint is for ADMINS only!"
- Username:
Database-Based Authentication
1. ডাটাবেস স্কিমা তৈরি:
users এবং authorities টেবিল তৈরি করুন।
CREATE TABLE users (
username VARCHAR(50) PRIMARY KEY,
password VARCHAR(100) NOT NULL,
enabled BOOLEAN NOT NULL
);
CREATE TABLE authorities (
username VARCHAR(50) NOT NULL,
authority VARCHAR(50) NOT NULL,
FOREIGN KEY (username) REFERENCES users(username)
);
2. ডেটা যোগ করুন:
INSERT INTO users (username, password, enabled) VALUES ('admin', '$2a$10$abcdefghijklmopqrstuvwxyz', true);
INSERT INTO authorities (username, authority) VALUES ('admin', 'ROLE_ADMIN');
3. Spring Security JDBC Configuration:
@Bean
public UserDetailsService userDetailsService(DataSource dataSource) {
JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);
userDetailsManager.setUsersByUsernameQuery("SELECT username, password, enabled FROM users WHERE username = ?");
userDetailsManager.setAuthoritiesByUsernameQuery("SELECT username, authority FROM authorities WHERE username = ?");
return userDetailsManager;
}
উপসংহার:
- Authentication: ব্যবহারকারীর পরিচয় যাচাই (ইউজারনেম ও পাসওয়ার্ড ভিত্তিক)।
- Authorization: যাচাই করা ব্যবহারকারী কোন রিসোর্স অ্যাক্সেস করতে পারে তা নির্ধারণ করা।
উপরের উদাহরণগুলো ব্যবহার করে আপনি Spring Security দিয়ে সহজেই Authentication এবং Authorization বাস্তবায়ন করতে পারবেন।
Read more